
Adélia Cruz
Neural Network Developer

A medida que la automatización impulsada por IA se vuelve más práctica en flujos de trabajo del mundo real, Agno ha surgido como un marco rápido y orientado a la privacidad para construir sistemas multiagente autónomos. Cuando estos agentes interactúan con sitios web mediante scraping, recolección de datos o navegación automatizada, los CAPTCHA a menudo se convierten en un problema.
CapSolver ayuda a resolver este problema permitiendo a los agentes de Agno manejar de manera confiable las páginas protegidas por CAPTCHA sin interrumpir el flujo de automatización. Juntos, Agno y CapSolver hacen más fácil construir automatizaciones escalables y sin intervención que funcionan en sitios web reales.
Agno es un marco y entorno de ejecución multiagente de código abierto para construir sistemas de IA que funcionan completamente dentro de su propia infraestructura. Está diseñado con rendimiento y privacidad en mente: sin plano de control externo y sin datos que salgan de su entorno.
| Componente | Descripción |
|---|---|
| Agentes | Unidades de IA autónomas con memoria, herramientas y integración de modelos |
| Equipos | Grupos de agentes colaborando en tareas complejas |
| Flujos de trabajo | Pipelines estructurados para ejecución predecible |
| AgentOS | Entorno basado en FastAPI para despliegue en producción |
CapSolver es un servicio líder para resolver CAPTCHA que proporciona soluciones impulsadas por IA para evitar diversos desafíos de CAPTCHA. Con soporte para múltiples tipos de CAPTCHA y tiempos de respuesta ultrarrápidos, CapSolver se integra sin problemas en flujos de trabajo automatizados.
Al construir agentes de Agno que interactúan con sitios web, ya sea para recolección de datos, pruebas automatizadas o agregación de contenido, los desafíos de CAPTCHA se convierten en un obstáculo significativo. Para un análisis más profundo sobre cómo resolver CAPTCHAs en entornos de navegador automatizados, consulte nuestra guía sobre cómo resolver CAPTCHA en Puppeteer. Aquí está la importancia de la integración:
Primero, instale los paquetes requeridos:
pip install agno
pip install requests
Agno es independiente del modelo con soporte integrado para 23+ proveedores de LLM:
# OpenAI
from agno.models.openai import OpenAIChat
# Anthropic Claude
from agno.models.anthropic import Claude
# Google Gemini
from agno.models.google import Gemini
# Y muchos más...
Agno le permite crear herramientas personalizadas que los agentes pueden usar para completar sus tareas. Aquí le mostramos cómo crear una herramienta de CapSolver para manejar desafíos de CAPTCHA:
import requests
import time
from agno.tools import tool
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_captcha(
website_url: str,
website_key: str,
captcha_type: str = "ReCaptchaV2TaskProxyLess"
) -> str:
"""
Resuelve desafíos de CAPTCHA usando la API de CapSolver.
Args:
website_url: La URL del sitio web con CAPTCHA
website_key: La clave del sitio del CAPTCHA
captcha_type: Tipo de CAPTCHA (ReCaptchaV2TaskProxyLess, ReCaptchaV3TaskProxyLess, AntiTurnstileTaskProxyLess)
Returns:
El token de solución del CAPTCHA
"""
# Crear tarea
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": captcha_type,
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error al crear la tarea: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Esperar resultado
for _ in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
solution = result.get("solution", {})
return solution.get("gRecaptchaResponse") or solution.get("token")
elif result.get("status") == "failed":
return f"Tarea fallida: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución del CAPTCHA"
import requests
import time
from agno.tools import tool
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_recaptcha_v2(website_url: str, website_key: str) -> str:
"""
Resuelve desafíos de reCAPTCHA v2 usando CapSolver.
Args:
website_url: La URL del sitio web con reCAPTCHA v2
website_key: La clave del sitio (atributo data-sitekey)
Returns:
El token g-recaptcha-response
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Esperar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from agno.tools import tool
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_recaptcha_v3(
website_url: str,
website_key: str,
page_action: str = "submit",
min_score: float = 0.7
) -> str:
"""
Resuelve desafíos de reCAPTCHA v3 con verificación basada en puntuación.
Args:
website_url: La URL del sitio web con reCAPTCHA v3
website_key: La clave del sitio de reCAPTCHA
page_action: El parámetro de acción para reCAPTCHA v3
min_score: Puntuación mínima requerida (0.1 a 0.9)
Returns:
El token g-recaptcha-response
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key,
"pageAction": page_action,
"minScore": min_score
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Esperar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from agno.tools import tool
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_turnstile(website_url: str, website_key: str) -> str:
"""
Resuelve desafíos de Cloudflare Turnstile.
Args:
website_url: La URL del sitio web con Turnstile
website_key: La clave del sitio del widget Turnstile
Returns:
El token de Turnstile
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
# Esperar resultado
for attempt in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera agotado para la solución"
import requests
import time
from agno.tools import tool
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_cloudflare_challenge(website_url: str, proxy: str) -> dict:
"""
Resuelve páginas de desafío de Cloudflare de 5 segundos.
Args:
website_url: La URL de la página protegida
proxy: Proxy en formato: http://user:pass@ip:puerto
Returns:
Diccionario con cookies y user_agent para acceder a la página protegida
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiCloudflareTask",
"websiteURL": website_url,
"proxy": proxy
}
}
# Crear tarea
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return {"error": result.get('errorDescription')}
task_id = result.get("taskId")
# Esperar resultado
for attempt in range(60):
time.sleep(3)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return {
"cookies": result["solution"]["cookies"],
"user_agent": result["solution"]["userAgent"]
}
if result.get("status") == "failed":
return {"error": result.get('errorDescription')}
return {"error": "Tiempo de espera agotado para la solución"}
Aquí hay un ejemplo completo de un agente de Agno que utiliza CapSolver para manejar desafíos de CAPTCHA:
import os
import requests
import time
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools import tool
# Configuración
CAPSOLVER_API_KEY = "SU_CLAVE_API_DE_CAPSOLVER"
os.environ["OPENAI_API_KEY"] = "SU_CLAVE_API_DE_OPENAI"
@tool
def solve_recaptcha_v2(website_url: str, website_key: str) -> str:
"""
Resuelve desafíos de reCAPTCHA v2 usando CapSolver.
Args:
website_url: La URL del sitio web con reCAPTCHA v2
website_key: La clave del sitio (atributo data-sitekey)
Returns:
El token g-recaptcha-response o mensaje de error
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
for _ in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera"
@tool
def solve_turnstile(website_url: str, website_key: str) -> str:
"""
Resuelve desafíos de Cloudflare Turnstile.
Args:
website_url: La URL del sitio web con Turnstile
website_key: La clave del sitio del widget Turnstile
Returns:
El token de Turnstile o mensaje de error
"""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
for _ in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("status") == "failed":
return f"Falló: {result.get('errorDescription')}"
return "Tiempo de espera"
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
if result.get("status") == "failed":
return f"Fallido: {result.get('errorDescription')}"
return "Tiempo de espera agotado"
@tool
def check_capsolver_balance() -> str:
"""
Comprueba el saldo actual de la cuenta CapSolver.
Devuelve:
Información del saldo actual
"""
response = requests.post(
"https://api.capsolver.com/getBalance",
json={"clientKey": CAPSOLVER_API_KEY}
)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
return f"Saldo: ${result.get('balance', 0):.4f}"
# Crear el Agente de Scraping Web
web_scraper_agent = Agent(
name="Agente de Scraping Web",
model=OpenAIChat(id="gpt-4o"),
tools=[solve_recaptcha_v2, solve_turnstile, check_capsolver_balance],
description="Especialista en scraping web que resuelve desafíos CAPTCHA automáticamente",
instructions=[
"Eres un especialista en scraping web con capacidades para resolver CAPTCHA.",
"Al encontrar un CAPTCHA, identifica el tipo y usa el solucionador correspondiente.",
"Para reCAPTCHA v2, usa solve_recaptcha_v2 con la URL y la clave del sitio.",
"Para Turnstile, usa solve_turnstile con la URL y la clave del sitio.",
"Siempre verifica el saldo antes de iniciar trabajos de scraping grandes."
],
markdown=True
)
def main():
print("=" * 60)
print("Demo de integración Agno + CapSolver")
print("=" * 60)
# Tarea: Resolver un desafío de reCAPTCHA
task = """
Necesito que resuelvas un desafío de reCAPTCHA v2.
URL del sitio web: https://www.google.com/recaptcha/api2/demo
Clave del sitio: 6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-
Por favor, resuelve este CAPTCHA y reporta los primeros 50 caracteres del token.
También verifica mi saldo en CapSolver antes de comenzar.
"""
response = web_scraper_agent.run(task)
print("\nRespuesta del Agente:")
print(response.content)
if __name__ == "__main__":
main()
Agno admite agentes multiagente. Aquí te explico cómo crear un equipo con agentes especializados en resolución de CAPTCHA:
from agno.agent import Agent
from agno.team import Team
from agno.models.openai import OpenAIChat
from agno.tools import tool
import requests
import time
CAPSOLVER_API_KEY = "TU_CLAVE_API_DE_CAPSOLVER"
@tool
def solve_any_captcha(
website_url: str,
website_key: str,
captcha_type: str = "ReCaptchaV2TaskProxyLess"
) -> str:
"""Solucionador universal de CAPTCHA que admite varios tipos."""
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": captcha_type,
"websiteURL": website_url,
"websiteKey": website_key
}
}
response = requests.post("https://api.capsolver.com/createTask", json=payload)
result = response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
for _ in range(60):
time.sleep(2)
result = requests.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
).json()
if result.get("status") == "ready":
solution = result.get("solution", {})
return solution.get("gRecaptchaResponse") or solution.get("token")
if result.get("status") == "failed":
return f"Fallido: {result.get('errorDescription')}"
return "Tiempo de espera agotado"
# Agente Especialista en CAPTCHA
captcha_agent = Agent(
name="Especialista en CAPTCHA",
model=OpenAIChat(id="gpt-4o"),
tools=[solve_any_captcha],
description="Experto en identificar y resolver diversos tipos de CAPTCHA",
instructions=[
"Identificar el tipo de CAPTCHA a partir del análisis de la página",
"Usar el solucionador correspondiente con los parámetros correctos",
"Informar claramente el éxito o el fracaso"
]
)
# Agente de Extracción de Datos
data_agent = Agent(
name="Extractores de Datos",
model=OpenAIChat(id="gpt-4o"),
description="Extrae y procesa datos de páginas web",
instructions=[
"Extraer datos estructurados del contenido HTML",
"Solicitar la resolución de CAPTCHA cuando sea necesario",
"Validar y limpiar los datos extraídos"
]
)
# Crear el equipo
scraping_team = Team(
name="Equipo de Scraping Web",
agents=[captcha_agent, data_agent],
description="Equipo especializado en scraping web con manejo de CAPTCHA"
)
Cada tipo de CAPTCHA requiere un método de envío diferente:
from selenium import webdriver
from selenium.webdriver.common.by import By
def submit_recaptcha_token(driver, token: str):
"""Inyectar token de reCAPTCHA y enviar"""
recaptcha_response = driver.find_element(By.ID, "g-recaptcha-response")
driver.execute_script("arguments[0].style.display = 'block';", recaptcha_response)
recaptcha_response.clear()
recaptcha_response.send_keys(token)
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
def submit_turnstile_token(driver, token: str):
"""Inyectar token de Turnstile y enviar"""
turnstile_input = driver.find_element(By.NAME, "cf-turnstile-response")
driver.execute_script("arguments[0].value = arguments[1];", turnstile_input, token)
form = driver.find_element(By.TAG_NAME, "form")
form.submit()
import requests
def access_cloudflare_protected_page(url: str, cf_solution: dict):
"""Usar solución de desafío de Cloudflare para acceder a la página protegida."""
session = requests.Session()
for cookie in cf_solution["cookies"]:
session.cookies.set(cookie["name"], cookie["value"])
headers = {"User-Agent": cf_solution["user_agent"]}
response = session.get(url, headers=headers)
return response.text
from agno.tools import tool
import time
@tool
def solve_with_retry(
website_url: str,
website_key: str,
max_retries: int = 3
) -> str:
"""Resolver CAPTCHA con reintentos automáticos en caso de fallo."""
for attempt in range(max_retries):
try:
result = solve_recaptcha_v2(website_url, website_key)
if not result.startswith("Error") and not result.startswith("Fallido"):
return result
except Exception as e:
if attempt == max_retries - 1:
return f"Todos los reintentos fallaron: {str(e)}"
time.sleep(2 ** attempt) # Retroalimentación exponencial
return "Máximo de reintentos excedido"
@tool
def check_balance() -> float:
"""Verificar el saldo de la cuenta de CapSolver."""
response = requests.post(
"https://api.capsolver.com/getBalance",
json={"clientKey": CAPSOLVER_API_KEY}
)
return response.json().get("balance", 0)
Agno admite operaciones asíncronas para un mejor rendimiento:
import asyncio
import aiohttp
from agno.tools import tool
@tool
async def solve_captcha_async(website_url: str, website_key: str) -> str:
"""Solucionador de CAPTCHA asíncrono para mejor concurrencia."""
async with aiohttp.ClientSession() as session:
payload = {
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": website_url,
"websiteKey": website_key
}
}
async with session.post(
"https://api.capsolver.com/createTask",
json=payload
) as response:
result = await response.json()
if result.get("errorId") != 0:
return f"Error: {result.get('errorDescription')}"
task_id = result.get("taskId")
for _ in range(60):
await asyncio.sleep(2)
async with session.post(
"https://api.capsolver.com/getTaskResult",
json={"clientKey": CAPSOLVER_API_KEY, "taskId": task_id}
) as response:
result = await response.json()
if result.get("status") == "ready":
solution = result.get("solution", {})
return solution.get("gRecaptchaResponse") or solution.get("token")
if result.get("status") == "failed":
return f"Fallido: {result.get('errorDescription')}"
return "Tiempo de espera agotado"
La integración de CapSolver con Agno desbloquea el potencial completo de agentes de IA autónomos para tareas basadas en web. Al combinar la orquestación de múltiples agentes rápida y privada de Agno con las capacidades líderes en resolución de CAPTCHA de CapSolver, los desarrolladores pueden construir soluciones de automatización robustas que manejen incluso los mecanismos de protección web más desafiantes.
Ya sea que estés construyendo pipelines de extracción de datos, marcos de prueba automatizados o agentes web inteligentes, la combinación Agno + CapSolver proporciona la velocidad, fiabilidad y escalabilidad necesarias para entornos de producción.
¿Listo para comenzar? Regístrate en CapSolver y usa el código de bonificación AGNO para obtener un 6% adicional en tu primer recarga!
Agno es un marco de múltiples agentes, runtime y plano de control para construir productos de IA. Es 529 veces más rápido que LangGraph con un 24 veces menor uso de memoria, y funciona completamente en su infraestructura para máxima privacidad.
CapSolver se integra con Agno a través de herramientas personalizadas decoradas con @tool. Crea funciones que envuelvan la API de CapSolver, permitiendo que tus agentes de IA resuelvan automáticamente desafíos CAPTCHA cuando los encuentren durante operaciones web.
CapSolver admite una amplia gama de tipos de CAPTCHA, incluyendo reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, Cloudflare Challenge, AWS WAF, GeeTest y muchos más.
CapSolver ofrece precios competitivos basados en el tipo y volumen de CAPTCHA resueltos. Visita capsolver.com para ver los detalles de precios actuales. Usa el código AGNO para obtener un 5% de bonificación en tu primer recarga.
Sí ¡Agno es independiente del modelo y admite más de 50 proveedores de modelos, incluyendo OpenAI, Anthropic Claude, Google Gemini, Groq y muchos otros.
Sí, Agno es de código abierto y se libera bajo la licencia MIT. El marco es gratuito de usar, aunque puede haber costos por llamadas a la API de LLM y servicios de resolución de CAPTCHA como CapSolver.
La clave del sitio generalmente se encuentra en la fuente HTML de la página. Busca:
data-sitekey o llamada a grecaptcha.render()data-sitekey en el widget de TurnstileAprende una arquitectura de raspado web escalable en Rust con reqwest, scraper, raspado asíncrono, raspado con navegador sin cabeza, rotación de proxies y manejo de CAPTCHA conforme.

Automatiza la resolución de CAPTCHA con Nanobot y CapSolver. Utiliza Playwright para resolver reCAPTCHA y Cloudflare autónomamente.
